package com.itany.corejava.code02_运算符;

/**
 * @author: 石小俊
 * @date: 2023年03月01日 14:56
 * @version: 1.0
 */
public class Test09_位运算符 {
    public static void main(String[] args) {
        int num1 = 5;
        int num2 = 8;
        // 位运算符是通过二进制进行运算的
        // num1的二进制数据:00000000 00000000 00000000 00000101
        // num2的二进制数据:00000000 00000000 00000000 00001000
        // &:对两个二进制数据每一位的值进行判断
        // 当两者都为1则返回1,否则返回0
        // 00000000 00000000 00000000 00000000
        // 其值对应的是十进制的:0
        System.out.println(num1 & num2);

        // |:只有0|0返回0,否则返回1
        // 00000000 00000000 00000000 00001101
        // 其值对应十进制的:13
        System.out.println(num1 | num2);

        // ~:原值如果是1,则返回0,原值如果是0则返回1
        // 11111111 11111111 11111111 11111010
        // 此时的值是一个补码,当前为负数,找到原码
        // 反码:11111111 11111111 11111111 11111001
        // 原码:10000000 00000000 00000000 00000110
        // 其值对应的十进制为:-6
        System.out.println(~num1);

        // ^:如果两位相同,则为0,否则为1
        // 00000000 00000000 00000000 00001101
        // 其值对应的十进制为:13
        System.out.println(num1 ^ num2);

        // <<:将二进制的所有位都向左边移动指定的位数,末尾补0,高位丢弃
        // 00000000 00000000 00000000 00010100
        // 其值对应的十进制为:20
        System.out.println(num1 << 2);

        // >>:将二进制的所有位都向右边移动指定的位数,高位补符号位,正数全部补0,负数全部补1
        // 00000000 00000000 00000000 00000101
        // 00000000 00000000 00000000 00000001 01
        // 超出范围的01被丢弃了
        System.out.println(num1 >> 2);

        // 如果值是一个负数
        // 原码:10000000 00000000 00000000 00001000
        // 在计算机中所有的运算针对的都是补码
        // 反码:11111111 11111111 11111111 11110111
        // 补码:11111111 11111111 11111111 11111000
        // 向右位移2位:11111111 11111111 11111111 11111110  00--被丢弃
        // 位移后的补码:11111111 11111111 11111111 11111110
        // 反码:11111111 11111111 11111111 11111101
        // 原码:10000000 00000000 00000000 00000010
        // 其值对应的二进制为:-2
        System.out.println(-8 >> 2);

        // >>>:与右移的区别就在于负数的运算,不管正数还是负数高位都补0
        // 原码:10000000 00000000 00000000 00001000
        // 补码:11111111 11111111 11111111 11111000
        // 向右位移2位:00111111 11111111 11111111 11111110  00--被丢弃
        // 位移后的补码:00111111 11111111 11111111 11111110
        // 原码:00111111 11111111 11111111 11111110
        // 其值对应的二进制为:1073741822
        System.out.println(-8 >>> 2);
    }
}
